package com.mmq.ets.modele;

import java.util.Observable;

import ca.etsmtl.log.util.IDLogger;

import com.mmq.ets.util.FabriqueForme;
import com.mmq.ets.util.Labo2Const;
import com.mmq.ets.util.ListeChainee;
import com.mmq.ets.util.AbstractTrieurFormes;

/**
    GestionaireFormes gére le stockage des formes. De plus, il enregistre avec IDLogger chaque forme ajoutée
	@author Francisco Quilodran Chavez
	@version 1.1
 */
public class GestionaireFormes extends Observable
{
	//Inserer ici la liste chaînée
	private ListeChainee<AbstractForme> listeFigures =new ListeChainee<AbstractForme>();
	private IDLogger logger;

	/**
	 * Cette méthode accepte les type LIGNE,CARRE,RECTANGLE,CERCLE et OVALE. Tous les formes doivent avoir quatre arguments à l'exception du CERCLE, il doit avoir trois, du contraire la méthode return null. 
	 * @param formeString la forme doit être formartée comme suit: "999 <TYPEFORME> ARGS </TYPEFORME>"
	 */
	public void ajouterForme(String formeString)
	{
		if (formeString!=null)
		{
			AbstractForme formTemp;
			formTemp=FabriqueForme.creerForme(formeString);
			if (formTemp!=null)
			{
				listeFigures.ajouter(formTemp);
				this.enregistrerForme(formTemp.getNseq());
				//TODO: verifier si la liste est remplie et notifier l'«Observer»		
				if(listeFigures.taille()>9)
				{
					this.afficherListe();
				}
			}
				
		}
	}
	/**
	 * Déclenche l'affichage de la liste
	 */
	public void afficherListe()
	{
		this.setChanged();
		this.notifyObservers(listeFigures);
	}
	/**
	 * 
	 * @return liste de formes stockées 
	 */
	public ListeChainee<AbstractForme>  getListeFigures() 
	{
		return listeFigures;
	}
	/**
	 * @param nseq numéro d'identification
	 */
	private void enregistrerForme(int nseq)
	{
		logger= IDLogger.getInstance();
		logger.logID(nseq);
	}
	public void trierFormes(Labo2Const.ActionTrier actionTrier)
	{	
		this.setChanged();
		try 
		{	
			this.notifyObservers(AbstractTrieurFormes.trierFormes(listeFigures, actionTrier));
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}    
	}
	
		
}
